home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / clang / ctask.zip / TSKKBD.ASM < prev    next >
Assembly Source File  |  1988-07-01  |  5KB  |  350 lines

  1. ;
  2. ;    CTask - Keyboard handler module.
  3. ;
  4. ;    Public Domain Software written by
  5. ;        Thomas Wagner
  6. ;        Patschkauer Weg 31
  7. ;        D-1000 Berlin 33
  8. ;        West Germany
  9. ;
  10. ;    This module traps the keyboard interrupts to allow task switching
  11. ;    on waiting for a character.
  12. ;    All characters are put into a (word)pipe, and can either be
  13. ;    read directly from the pipe, or through the normal INT 16 channels.
  14. ;
  15.     name    tskkbd
  16.     .model    large
  17. ;
  18.     public    _tsk_install_kbd
  19.     public    _tsk_remove_kbd
  20. ;
  21.     public    _t_read_key
  22.     public    _t_wait_key
  23.     public    _t_keyhit
  24. ;
  25.     include    tsk.mac
  26. ;
  27. BUFSIZE    =    80    ; max. number of chars in pipe
  28. ;
  29. intseg    segment at 0
  30.         org    09h*4
  31. hwdoff        dw    ?    ; keyboard hardware interrupt
  32. hwdseg        dw    ?
  33.         org    16h*4
  34. kbdoff        dw    ?    ; keyboard I/O interrupt
  35. kbdseg        dw    ?
  36. ;
  37. intseg    ends
  38. ;
  39. ;----------------------------------------------------------------------------
  40. ;
  41. ;    Variables
  42. ;
  43.     IF    TSK_NAMEPAR
  44.     .data
  45. kbd_name    db    "KBDBUF",0
  46.     ENDIF
  47. ;
  48.     .data?
  49. ;
  50. key_avail    wpipe <>
  51. ;
  52. buffer        dw    BUFSIZE dup(?)
  53. ;
  54.     .code
  55. ;
  56. kbd_flag    db    0
  57. ;
  58. ;    Original Interrupt-Entries
  59. ;
  60. savhwd        label    dword        ; original hardware int entry
  61. savhwdoff    dw    ?
  62. savhwdseg    dw    ?
  63. ;
  64. savkbd        label    dword        ; original keyboard I/O entry
  65. savkbdoff    dw    ?
  66. savkbdseg    dw    ?
  67. ;
  68. ;
  69. ;---------------------------------------------------------------------------
  70. ;
  71.     .code
  72. ;
  73.     extrn    _create_wpipe: far
  74.     extrn    _delete_wpipe: far
  75.     extrn    _read_wpipe: far
  76.     extrn    _check_wpipe: far
  77.     extrn    _c_write_wpipe: far
  78. ;
  79. ;
  80. ;    void tsk_install_kbd (void)
  81. ;
  82. ;        Install keyboard handler
  83. ;
  84. _tsk_install_kbd    proc    far
  85. ;
  86.     IF    TSK_NAMEPAR
  87.     mov    ax,offset kbd_name
  88.     push    ds
  89.     push    ax
  90.     ENDIF
  91.     mov    ax,BUFSIZE
  92.     push    ax
  93.     mov    ax,offset buffer
  94.     push    ds
  95.     push    ax
  96.     mov    ax,offset key_avail
  97.     push    ds
  98.     push    ax
  99.     call    _create_wpipe
  100.     IF    TSK_NAMEPAR
  101.     add    sp,14
  102.     ELSE
  103.     add    sp,10
  104.     ENDIF
  105. ;
  106. ;    Save old interrupt vectors
  107. ;
  108.         push    es
  109.     xor    ax,ax
  110.     mov    es,ax
  111. ;
  112.         assume  es:intseg
  113. ;
  114.     mov    ax,kbdoff
  115.     mov    savkbdoff,ax
  116.     mov    ax,kbdseg
  117.     mov    savkbdseg,ax
  118. ;
  119.     mov    ax,hwdoff
  120.     mov    savhwdoff,ax
  121.     mov    ax,hwdseg
  122.     mov    savhwdseg,ax
  123. ;
  124. ;    Enter new Interrupt-Entries
  125. ;
  126.     cli
  127.     mov    kbdoff,offset kbdentry
  128.     mov    kbdseg,cs
  129.     mov    hwdoff,offset hwdentry
  130.     mov    hwdseg,cs
  131.     sti
  132.         pop     es
  133. ;
  134.     ret
  135. ;
  136.     assume    es:nothing
  137. ;
  138. _tsk_install_kbd    endp
  139. ;
  140. ;
  141. ;    void tsk_remove_kbd (void)
  142. ;
  143. ;        Un-install keyboard handler
  144. ;
  145. _tsk_remove_kbd    proc    far
  146. ;
  147. ;    Delete pipe
  148. ;
  149.     mov    ax,offset key_avail
  150.     push    ds
  151.     push    ax
  152.     call    _delete_wpipe
  153.     add    sp,4
  154. ;
  155.         push    es
  156.     xor    ax,ax
  157.     mov    es,ax
  158. ;
  159.         assume  es:intseg
  160. ;
  161. ;    Restore interrupt entries
  162. ;
  163.     cli
  164. ;
  165.     mov    ax,savkbdoff
  166.     mov    kbdoff,ax
  167.     mov    ax,savkbdseg
  168.     mov    kbdseg,ax
  169. ;
  170.     mov    ax,savhwdoff
  171.     mov    hwdoff,ax
  172.     mov    ax,savhwdseg
  173.     mov    hwdseg,ax
  174. ;
  175.     sti
  176. ;
  177.         pop     es
  178.     ret
  179. ;
  180.     assume    es:nothing
  181. ;
  182. _tsk_remove_kbd    endp
  183. ;
  184. ;
  185. ;---------------------------------------------------------------------------
  186. ;
  187. ;    int t_read_key (void)
  188. ;
  189. ;    Waits for key from keyboard. Returns char in lower byte,
  190. ;    Scan-Code in upper byte.
  191. ;
  192. _t_read_key    proc    far
  193. ;
  194.     xor    ax,ax        ; no timeout
  195.     push    ax
  196.     push    ax
  197.     mov    ax,offset key_avail
  198.     push    ds
  199.     push    ax
  200.     call    _read_wpipe
  201.     add    sp,8
  202.     ret
  203. ;    
  204. _t_read_key    endp
  205. ;
  206. ;
  207. ;    int t_wait_key (dword timeout)
  208. ;
  209. ;    Waits for key from keyboard. Returns char in lower byte,
  210. ;    Scan-Code in upper byte.
  211. ;
  212. _t_wait_key    proc    far
  213. ;
  214.     push    bp
  215.     mov    bp,sp
  216.     push    8[bp]        ; timeout
  217.     push    6[bp]
  218.     mov    ax,offset key_avail
  219.     push    ds
  220.     push    ax
  221.     call    _read_wpipe
  222.     add    sp,8
  223.     pop    bp
  224.     ret
  225. ;    
  226. _t_wait_key    endp
  227. ;
  228. ;
  229. ;    int t_keyhit (void)
  230. ;
  231. ;    Checks if char is available. Returns -1 if not, else the
  232. ;    character value. The character remains in the buffer.
  233. ;
  234. _t_keyhit    proc    far
  235. ;
  236.     mov    ax,offset key_avail
  237.     push    ds
  238.     push    ax
  239.     call    _check_wpipe
  240.     add    sp,4
  241.     ret
  242. ;
  243. _t_keyhit    endp
  244. ;
  245. ;---------------------------------------------------------------------------
  246. ;
  247. ;    INT 9 - Keyboard hardware interrupt
  248. ;
  249. hwdentry    proc    far
  250. ;
  251.     pushf
  252.     call    cs:savhwd    ; process key
  253.     push    ds
  254.     push    es
  255.     push    ax
  256.     push    bx
  257.     push    cx
  258.     push    dx
  259.     mov    ax,seg dgroup
  260.     mov    ds,ax
  261.     mov    es,ax
  262. ;
  263.     mov    ah,1
  264.     pushf
  265.     call    cs:savkbd    ; check if char available
  266.     jz    hwd_ret        ; return if not
  267. ;
  268.     xor    ah,ah    
  269.     pushf
  270.     call    cs:savkbd    ; get the key
  271. ;
  272.     push    ax        ; push key
  273.     mov    ax,offset key_avail
  274.     push    ds
  275.     push    ax
  276.     call    _c_write_wpipe
  277.     add    sp,6
  278. ;
  279. hwd_ret:
  280.     pop    dx
  281.     pop    cx
  282.     pop    bx
  283.     pop    ax
  284.     pop    es
  285.     pop    ds
  286.     iret
  287. ;
  288. hwdentry    endp
  289. ;
  290. ;---------------------------------------------------------------------------
  291. ;
  292. ;    INT 16 - Keyboard I/O
  293. ;
  294. kbdentry    proc    far
  295. ;
  296.     cmp    ah,2
  297.     jb    kbd_funcs
  298.     jmp    cs:savkbd    ; pass on functions >= 2
  299. ;    
  300. kbd_funcs:
  301.     sti
  302.     push    ds
  303.     push    es
  304.     push    dx
  305.     push    cx
  306.     push    bx
  307.     mov    bx,seg dgroup
  308.     mov    ds,bx
  309.     mov    es,bx
  310. ;
  311.     cmp    ah,1
  312.     jb    kbd_read
  313. ;
  314.     mov    bx,offset key_avail
  315.     push    ds
  316.     push    bx
  317.     call    _check_wpipe
  318.     add    sp,4
  319.     cmp    ax,0ffffh
  320.     jne    kbd_gotone
  321.     xor    ax,ax
  322. kbd_gotone:
  323.     pop    bx
  324.     pop    cx
  325.     pop    dx
  326.     pop    es
  327.     pop    ds
  328.     ret    2
  329. ;
  330. kbd_read:
  331.     xor    ax,ax
  332.     push    ax
  333.     push    ax
  334.     mov    bx,offset key_avail
  335.     push    ds
  336.     push    bx
  337.     call    _read_wpipe
  338.     add    sp,8
  339.     pop    bx
  340.     pop    cx
  341.     pop    dx
  342.     pop    es
  343.     pop    ds
  344.     iret
  345. ;
  346. kbdentry    endp
  347. ;
  348.     end
  349.  
  350.